package com.abc.xml.sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class XmlParseHandler extends DefaultHandler {

   private List<User> userList;
   private User user;

   private String currentTag;

   /**
    * 文档解析开始调用一次
    *
    * @throws SAXException
    */
   @Override
   public void startDocument() throws SAXException {
      super.startDocument();

      userList = new ArrayList<>();

      System.out.println("开始解析文档");
   }

   /**
    * 标签节点、解析开始时调用
    *
    * @param uri 命名空间的uri
    * @param localName 标签的名称
    * @param qName   带命名空间的标签名称
    * @param attributes 属性
    * @throws SAXException
    */
   @Override
   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      super.startElement(uri, localName, qName, attributes);

      if ("user".equals(qName)) {
         for (int i = 0; i < attributes.getLength(); i++) {
            user = new User();
            if ("id".equals(attributes.getQName(i))) {
               user.setId(attributes.getValue(i));
            }
         }
      }

      currentTag = qName;
   }

   /**
    * 解析内存时调用
    *
    * @param ch
    * @param start
    * @param length
    * @throws SAXException
    */
   @Override
   public void characters(char[] ch, int start, int length) throws SAXException {
      super.characters(ch, start, length);
      String value = new String(ch, start, length);

      if ("name".equals(currentTag)) {
         // 该节点为name节点
         user.setName(value);
      }
      else if ("password".equals(currentTag)) {
         // 该节点为password节点
         user.setPassword(value);
      }
   }

   /**
    * 标签（节点）解析结束后调用
    *
    * @param uri
    * @param localName
    * @param qName
    * @throws SAXException
    */
   @Override
   public void endElement(String uri, String localName, String qName) throws SAXException {
      super.endElement(uri, localName, qName);

      if ("user".equals(qName)) {
         userList.add(user);
         user = null;
      }
      currentTag = null;
   }

   /**
    * 文档解析结束后调用，该方法只会调用一次
    *
    * @throws SAXException
    */
   @Override
   public void endDocument() throws SAXException {
      super.endDocument();

      System.out.println("结束解析文档");

   }

   public List<User> getUserList() {
      return userList;
   }
}
